use std::io;    // 导入相关的包
use rand::Rng;
use std::cmp::Ordering;

// 定义入口函数
fn main() { 

    // 调用宏，`!`说明是宏
    println!("Guess the number!");

    // 调用rand库中的函数
    // let定义变量，变量默认是不可变的
    let secret_number = rand::thread_rng().gen_range(1..101);
    // 调用宏，{}是占位符
    println!("The secret number is {}.", secret_number);


    // 循环
    loop {
        println!("Please input your guess.");
        // mut表示这个变量是可变的
        let mut guess = String::new();  // 调用String::new创建字符串对象
        // 调用io库中的函数
        io::stdin()
            .read_line(&mut guess)  // &mut中的&表示是传入引用，mut表示被引用对象可变
            .expect("Failed to read line"); // 出现错误时会打印这一句并退出

        // u32表示unsigned 32bit 整数
        // 使用`:变量类型`进行类型标注
        // let 变量名:变量类型
        let guess: u32 = match guess.trim().parse() { // match语句，可以方便地定义一系列分支
            Ok(num) => num,     // 定义的方法是 pattern => expression/statement
            Err(_) => {
                println!("Invalid characters are ignored.");
                continue;
            },
        };  // 最终match会返回一个expression，然后赋值给guess.

        println!("You guessed: {}", guess);

        match guess.cmp(&secret_number) { // 传引用，但引用对象不可变
            Ordering::Less => println!("Too small!"),
            Ordering::Greater => println!("Too big!"),
            Ordering::Equal => {
                println!("You win!");
                break;
            },
        }
    }
}
